#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[] = {1, 2, 3, 4, 5}, *p = a, i; // 相当于int *p=&a[0];
    for (i = 0; i < 5; ++i)               // 演示4种输出方式
        printf("%d %d %d %d ", a[i], *(a + i), *(p + i), p[i]);
    printf("\n%#p,%#p\n", a, p); // p指向数组a的首地址
    for (i = 0; i < 5; i++)      // 演示指针使用下标
        printf("%d ", p[i]);
    printf("\n");
    for (; p < a + 5; ++p) // 演示从a[0]开始输出至a[4]
        printf("%d ", *p);
    printf("\n");
    for (--p; p >= a; --p) // 演示从a[4]开始输出至a[0]
        printf("%d ", *p);
    printf("\n");
    for (i = 0; i < 5; ++i) // 演示越界，无a[4]内容
        printf("%d ", *(p + i));
    printf("\n");
    p = a;                  // 恢复p指向a
    for (i = 0; i < 5; ++i) // 正常演示，有a[4]内容
        printf("%d ", *(p + i));
    printf("\n");
    system("pause");
    return 0;
}
/*
数组名就是数组的首地址，指针的概念就是地址，
所以说数组名就是一个常量指针。

在数组名和指针之间还是有一个重要区别的，必须记住指针是变量，
    故p=a或p++、p--都是有意义的操作。
但数组名是常量指针，而不是变量。常量指针不能作为左值，
    因此表达式a=p和a++都是非法操作。
*/